package com.example.demo.service;

import com.example.demo.model.Question;
import com.example.demo.model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

/**
 * 问题服务类，负责处理用户问题的存储和检索
 * 
 * 类整体功能：负责将用户的问题及回答保存到MongoDB数据库中，并提供各种查询方法。
 * 关键组件：
 * MongoDBService：与MongoDB数据库交互的封装服务。
 * UserService：用于获取当前提问的用户信息。
 * 核心方法：
 * saveQuestion(...)：接收用户提问信息和回答，构造数据并插入MongoDB。
 * getUserQuestions(...)：获取指定用户的所有问题。
 * searchQuestions(...)：根据关键词搜索问题。
 */
@Service
public class QuestionServiceMongo {
    // 日志记录器
    private static final Logger logger = LoggerFactory.getLogger(QuestionServiceMongo.class);

    // MongoDB服务组件，用于与MongoDB数据库交互
    private final MongoDBService mongoDBService;
    // 用户服务组件，用于获取用户信息
    private final UserService userService;

    // 构造函数，由Spring自动注入MongoDBService和UserService
    @Autowired
    public QuestionServiceMongo(MongoDBService mongoDBService, UserService userService) {
        this.mongoDBService = mongoDBService;
        this.userService = userService;
    }

    /**
     * 保存用户提问及回答到MongoDB中
     * @param username 用户名
     * @param questionText 问题文本
     * @param answerText 回答文本
     * @return 保存的问题对象
     */
    public Question saveQuestion(String username, String questionText, String answerText) {
        try {
            // 根据用户名获取用户信息
            User user = userService.getUserByUsername(username).orElse(null);
            if (user == null) {
                // 用户不存在，记录错误并返回null
                logger.error("User not found: {}", username);
                return null;
            }

            // 构建Question对象
            Question question = new Question(user.getId(), username, questionText, answerText);
            
            // 保存到MongoDB
            Question savedQuestion = mongoDBService.saveQuestion(question);
            
            // 保存成功，记录信息并返回保存的问题对象
            logger.info("Question saved successfully with ID: {}", savedQuestion.getId());
            return savedQuestion;
        } catch (Exception e) {
            // 捕获并记录保存问题过程中出现的异常
            logger.error("Error saving question", e);
            return null;
        }
    }

    /**
     * 根据ID获取问题
     * @param id 问题ID
     * @return 包含问题的Optional对象
     */
    public Optional<Question> getQuestionById(String id) {
        return mongoDBService.findQuestionById(id);
    }

    /**
     * 获取指定用户的所有问题
     * @param userId 用户ID
     * @return 该用户的所有问题列表
     */
    public List<Question> getUserQuestions(Long userId) {
        return mongoDBService.findQuestionsByUserId(userId);
    }

    /**
     * 根据用户名获取该用户的所有问题
     * @param username 用户名
     * @return 该用户的所有问题列表
     */
    public List<Question> getUserQuestionsByUsername(String username) {
        return mongoDBService.findQuestionsByUsername(username);
    }

    /**
     * 根据关键词搜索问题
     * @param keyword 关键词
     * @return 包含关键词的问题列表
     */
    public List<Question> searchQuestions(String keyword) {
        return mongoDBService.searchQuestionsByKeyword(keyword);
    }

    /**
     * 获取所有问题
     * @return 所有问题的列表
     */
    public List<Question> getAllQuestions() {
        return mongoDBService.findAllQuestions();
    }

    /**
     * 分页获取问题
     * @param pageable 分页参数
     * @return 分页的问题结果
     */
    public Page<Question> getQuestionsWithPagination(Pageable pageable) {
        return mongoDBService.findQuestionsWithPagination(pageable);
    }

    /**
     * 根据用户名和问题文本关键词查询问题，按创建时间倒序排列
     * @param username 用户名（可选，为null时查询所有用户）
     * @param questionText 问题文本关键词（可选，为null时查询所有问题）
     * @return 按创建时间倒序排列的问题列表
     */
    public List<Question> getQuestionsByUsernameAndKeywordOrderByCreatedAtDesc(String username, String questionText) {
        return mongoDBService.findQuestionsByUsernameAndKeywordOrderByCreatedAtDesc(username, questionText);
    }

    /**
     * 分页查询问题，支持按用户名和问题文本关键词查询，按创建时间倒序排列
     * @param username 用户名（可选，为null时查询所有用户）
     * @param questionText 问题文本关键词（可选，为null时查询所有问题）
     * @param pageable 分页参数
     * @return 分页的问题结果
     */
    public Page<Question> getQuestionsByUsernameAndKeywordOrderByCreatedAtDescWithPagination(String username, String questionText, Pageable pageable) {
        return mongoDBService.findQuestionsByUsernameAndKeywordOrderByCreatedAtDescWithPagination(username, questionText, pageable);
    }

    /**
     * 删除问题
     * @param id 要删除的问题ID
     */
    public void deleteQuestion(String id) {
        mongoDBService.deleteQuestion(id);
    }
}
